home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / artemis1 / src / artemis.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-08  |  12.7 KB  |  510 lines

  1. /*
  2.     ARTemis (Graphic Editor for FM-TOWNS)
  3.     (c) MATSUUCHI Ryosuke 1992,1993,1994,1995
  4.  
  5.     artemis.c
  6. */
  7.  
  8. // #define DEBUG
  9.  
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <ctype.h>
  13. #include <stdlib.h>
  14. #include <egb.h>
  15. #include <mos.h>
  16. #include <stdarg.h>
  17. #include <fmcfrb.h>
  18.  
  19. #define    MODULE_MAIN
  20. #include "ge.h"
  21. #include "plt16.h"
  22. #include "imageman.h"
  23. #include "dispman.h"
  24. #include "mask.h"
  25. #include "mainmenu.h"
  26.  
  27. /*--------------------------------------------------------*/
  28. /*                        変数宣言                        */
  29. /*--------------------------------------------------------*/
  30.  
  31.  
  32. int        mode;                // MODE16, MODE32K
  33. int        white = 32767;        // 画面モード scrmode での「白」色を表す色コード
  34. int        minzoomrate = 1;    // 拡大率の最小値
  35.  
  36. int        pltnum;
  37.                 // 現在選択しているパレットの番号(0..15)
  38.                 // 16色編集時は、これがそのまま描画色になるが、
  39.                 // 3万色編集時には、plt[pltnum] が描画色である。
  40.  
  41. MSDAT    ms = {0,0,0,0,OFF,OFF};
  42.                 // マウスの状態(座標・ボタン)をあらわす。
  43.                 // ms_get により設定される。
  44.  
  45. int        mixrate = 256;            // 描画濃度
  46. int        blkop = DrawNORMAL;        // コピー/矩形描画時の演算
  47. bool    blkop_edge = YES;        // 3万色編集でのコピー時の黒透過境界補正スイッチ
  48. bool    areaadj = NO;            // 範囲指定時に、座標を大格子上に限定するスイッチ
  49. int        blot_depth = 16;        // にじみペン手続きの再帰回数
  50. int        goshi_para = 128;        // こすりペンのこすれやすさ(0..256)
  51. int        spray_r = 8;            // スプレー半径
  52. int        spray_t = 1;            // スプレー種別 0:ドット, 1:ペン先
  53. int        colmodel = MODEL_RGB;    // 色選びの方法 (MODEL_RGB / MODEL_HLS)
  54. int        csrcol;                    // カーソルの色
  55. int        whiteback = NO;            // 起動時の背景色(YES:白  NO:黒)
  56. bool    use_partsave = YES;        // 部分セーブ機能を使うかどうか
  57. bool    use_loadmove = YES;        // ロード位置指定機能を使うかどうか
  58. int        forecol, backcol;
  59. int        font12seg;                // 12dot font が存在するセグメント
  60. char    debugmsg[128];            // デバッグメッセージの出力バッファ
  61.  
  62.  
  63. bool    ryosuke = NO;            // 作者専用オプションが指定されたかどうか
  64. bool    ryosuke_pat = NO;        // 作者専用オプション2が指定されたかどうか
  65.  
  66. bool    debug = NO;                // デバッグスイッチ
  67.  
  68.  
  69. static    int        _editxlen,_editylen;
  70. static    bool    _lat1disp,_lat2disp;
  71. static    bool    _lat2xlen,_lat2ylen;
  72. static    int        _zoomrate;
  73.  
  74.  
  75. /*--------------------------------------------------------*/
  76. /*               デバッグ用メッセージの出力               */
  77. /*--------------------------------------------------------*/
  78.  
  79.  
  80. void debug_msg_dummy(char *format, ...)
  81. {
  82.   return;
  83. }
  84.  
  85. void debug_msg(char *format, ...)
  86. {
  87.   extern void colspc_debugmsg(char *buf);
  88.   char sbuf[200];
  89.   if (!debug)
  90.     return;
  91.   va_list ap;
  92.   va_start(ap, format);
  93.   FILE *fp;
  94.   fp = fopen("msg","a");
  95.   if (fp!=NULL)
  96.     {
  97.       vfprintf(fp,format, ap);
  98.       fclose(fp);
  99.     }
  100.   va_end(ap);
  101. }
  102.  
  103.  
  104. void msgout_abs(char *msg)
  105. {
  106.     FILE *fp;
  107.     fp = fopen("msg","a");
  108.     if (fp!=NULL)
  109.     {
  110.         fprintf(fp,"%s\n",msg);
  111.         fclose(fp);
  112.     }
  113. }
  114.  
  115.  
  116. void msgout(char *msg)
  117. {
  118.     if (debug)
  119.         msgout_abs(msg);
  120. }
  121.  
  122. /*--------------------------------------------------------*/
  123. /*                 変数の初期化・チェック                 */
  124. /*--------------------------------------------------------*/
  125.  
  126.  
  127. static int initVar()
  128. {
  129.     int i;
  130.     mode = MODE32K;
  131.     pltnum=PLTNUM-1;
  132.     white = 32767;
  133.     colmodel = MODEL_RGB;
  134.     csrcol = COL_cursorLight;
  135.     _editxlen = 512, _editylen = 480;
  136.     _lat1disp = _lat2disp = NO;
  137.     _lat2xlen = _lat2ylen = 16;
  138.     _zoomrate = 2;
  139.     mixrate = 256;
  140.     extern int mma_allocSeg(char* segname);
  141.     font12seg = mma_allocSeg("FONT");
  142.     return 0;
  143. }
  144.  
  145.  
  146.  
  147. static void checkPara()    // 動作状態設定に矛盾があれば直す
  148. {
  149.     minzoomrate = 1;
  150.     if (mode == MODE32K)
  151.     {
  152.         if (_editxlen < 320)
  153.             _editxlen = 320;
  154.         else if (_editylen < 240)
  155.             _editylen = 240;
  156.         if (_editxlen < 512 || _editylen < 480)
  157.             minzoomrate = 2;
  158.     }
  159.     if (_zoomrate < minzoomrate)
  160.         _zoomrate = minzoomrate;
  161. }
  162.  
  163.  
  164.  
  165. static int initIO()
  166. {
  167.     static    int        _plt32K[] =
  168.         { 0, 0, GRB(21, 0, 0), GRB(31,20,10),
  169.           GRB( 0, 0,31), GRB(13, 5,31), GRB( 0,22, 0), GRB(23, 3,31),
  170.           GRB( 6,31, 0), GRB(16,31, 5), GRB(31,31, 0), GRB(23,31,19),
  171.           GRB(10, 0, 0), GRB( 0,31,31), GRB(14,14,14), GRB(31,31,31) };
  172.     static    int        _plt16[] =
  173.         { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
  174.  
  175.     DMnew(0);
  176.     key_init();
  177.     minit();
  178.     MOS_resolution(0,(DMgetifonepage() ? 17 : 3));
  179.     MOS_writePage(0);
  180.  
  181.     int_init();
  182.     plt_init();
  183.     if (!DMgetifonepage())
  184.     {
  185.         page_edit();
  186.         #if 0
  187.         if (mode == MODE32K)
  188.             memcpy(plt, _plt32K, sizeof(int)*16);
  189.         else if (mode == MODE16)
  190.         {
  191.             memcpy(plt, _plt16, sizeof(int)*16);
  192.             if (plt16_init() != 0)    exit(0);
  193.         }
  194.         #endif
  195.         page_menu();
  196.     }
  197.     else
  198.     {
  199.         #if 0
  200.         if (mode == MODE32K)
  201.             memcpy(plt, _plt32K, sizeof(int)*16);
  202.         else if (mode == MODE32K)
  203.         {
  204.             memcpy(plt, _plt16, sizeof(int)*16);
  205.             if (plt16_init() != 0)    exit(0);
  206.         }
  207.         #endif
  208.     }
  209.     return 0;
  210. }
  211.  
  212.  
  213. /*--------------------------------------------------------*/
  214. /*                     画面の初期描画                     */
  215. /*--------------------------------------------------------*/
  216.  
  217.  
  218. static void iniScr()
  219. {
  220.     DEBUG_MSG("iniScr begin");
  221.     if (whiteback)
  222.     {
  223.         EIMrboxfill(0,0,EIMgetxsize(),EIMgetysize(),white,DrawNORMAL);
  224.         forecol = 0,  backcol = white;
  225.     }
  226.     else
  227.         forecol = white,  backcol = 0;
  228.     DEBUG_MSG("(iniScr) --- A");
  229.     DMimage_setzoomrate(_zoomrate);
  230.     DMimage_setlatticeswitch(_lat1disp,_lat2disp);
  231.     DMimage_setlatticesize(_lat2xlen,_lat2ylen);
  232.     DEBUG_MSG("(iniScr) --- B");
  233.     DEBUG_MSG("iniScr end");
  234. }
  235.  
  236.  
  237. /*--------------------------------------------------------*/
  238. /*                 設定ファイルの読み書き                 */
  239. /*--------------------------------------------------------*/
  240.  
  241.  
  242. #define    CFG_NAME    "artemis.cfg"
  243. static char config_fname[128] = {0};
  244.  
  245.  
  246. static void loadConfig()
  247. {
  248.     _searchenv(CFG_NAME, "PATH", config_fname);
  249.     if (config_fname[0] == 0)
  250.     {
  251.         _searchenv(CFG_NAME, "PATH386", config_fname);
  252.         if (config_fname[0] == 0)
  253.             return; // ファイルが存在しない
  254.     }
  255.     FILE *fp;
  256.     if ((fp = fopen(config_fname, "r")) == NULL)
  257.         return;        // たぶんありえない
  258.     char linbuf[256];
  259.     while (fgets(linbuf, 256, fp) != NULL)
  260.     {
  261.         static char limits[] = " \t\n.,:;=";
  262.         char *p;
  263.         if ((p = strtok(linbuf,limits)) == NULL)
  264.             continue;
  265.         if (strcmp(p, "zoomrate") == 0)
  266.             _zoomrate = atoi(strtok(NULL,limits));
  267.         else if (strcmp(p, "lattice1") == 0)
  268.             _lat1disp = (strcmp(strtok(NULL,limits),"on") == 0 ? YES : NO);
  269.         else if (strcmp(p, "lattice2") == 0)
  270.             _lat2disp = (strcmp(strtok(NULL,limits),"on") == 0 ? YES : NO);
  271.         else if (strcmp(p, "lat2size") == 0)
  272.         {
  273.             _lat2xlen = atoi(strtok(NULL,limits));
  274.             _lat2ylen = atoi(strtok(NULL,limits));
  275.         }
  276.         else if (strcmp(p, "mixrate") == 0)
  277.             mixrate = atoi(strtok(NULL,limits));
  278.         else if (strcmp(p, "blkop") == 0)
  279.             blkop = atoi(strtok(NULL,limits));
  280.         else if (strcmp(p, "blkop_edge") == 0)
  281.             blkop_edge = (strcmp(strtok(NULL,limits),"on") == 0 ? YES : NO);
  282.         else if (strcmp(p, "areaadj") == 0)
  283.             areaadj = (strcmp(strtok(NULL,limits),"on") == 0 ? YES : NO);
  284.         else if (strcmp(p, "blot_para") == 0)
  285.             blot_depth = atoi(strtok(NULL,limits));
  286.         else if (strcmp(p, "goshi_para") == 0)
  287.             goshi_para = atoi(strtok(NULL,limits));
  288.         else if (strcmp(p, "spray_r") == 0)
  289.             spray_r = atoi(strtok(NULL,limits));
  290.         else if (strcmp(p, "spray_t") == 0)
  291.             spray_t = atoi(strtok(NULL,limits));
  292.         else if (strcmp(p, "colmodel") == 0)
  293.             colmodel = atoi(strtok(NULL,limits));
  294.         else if (strcmp(p, "csrcol") == 0)
  295.             csrcol = atoi(strtok(NULL,limits));
  296.         else if (strcmp(p, "backcol") == 0)
  297.             whiteback = (strcmp(strtok(NULL,limits),"white") == 0 ? YES : NO);
  298.         else if (strcmp(p, "partsave") == 0)
  299.             use_partsave = (strcmp(strtok(NULL,limits),"YES") == 0 ? YES:NO);
  300.         else if (strcmp(p, "loadmove") == 0)
  301.             use_loadmove = (strcmp(strtok(NULL,limits),"YES") == 0 ? YES:NO);
  302.     }
  303.     fclose(fp);
  304. }
  305.  
  306.  
  307. static void saveConfig()
  308. {
  309.     if (config_fname[0] == 0)
  310.         strcpy(config_fname,CFG_NAME);
  311.     if (fexist(config_fname))
  312.     {
  313.         if (resetfattr(config_fname) != 0)
  314.             return;
  315.     }
  316.     FILE *fp;
  317.     if ((fp = fopen(config_fname,"w")) == NULL)
  318.         return;
  319.     fprintf(fp, "zoomrate   %d\n", DMimage_getzoomrate());
  320.     bool f1,f2;
  321.     int t1,t2;
  322.     DMimage_getlatticeswitch(&f1,&f2);
  323.     fprintf(fp, "lattice1   %s\n", (f1 ? "on":"off"));
  324.     fprintf(fp, "lattice2   %s\n", (f2 ? "on":"off"));
  325.     DMimage_getlatticesize(&t1,&t2);
  326.     fprintf(fp, "lat2size   %d %d\n", t1, t2);
  327.     fprintf(fp, "mixrate    %d\n", mixrate);
  328.     fprintf(fp, "blkop      %d\n", blkop);
  329.     fprintf(fp, "blkop_edge %s\n", (blkop_edge ? "on":"off"));
  330.     fprintf(fp, "areaadj    %s\n", (areaadj ? "on":"off"));
  331.     fprintf(fp, "blot_para  %d\n", blot_depth);
  332.     fprintf(fp, "goshi_para %d\n", goshi_para);
  333.     fprintf(fp, "spray_r    %d\n", spray_r);
  334.     fprintf(fp, "spray_t    %d\n", spray_t);
  335.     fprintf(fp, "colmodel   %d\n", colmodel);
  336.     fprintf(fp, "csrcol     %d\n", csrcol);
  337.     fprintf(fp, "backcol    %s\n", (whiteback ? "white":"black"));
  338.     fprintf(fp, "partsave   %s\n", (use_partsave ? "YES" : "NO"));
  339.     fprintf(fp, "loadmove   %s\n", (use_loadmove ? "YES" : "NO"));
  340.     fclose(fp);
  341. }
  342.  
  343.  
  344. /*--------------------------------------------------------*/
  345. /*                    オプション読込                      */
  346. /*--------------------------------------------------------*/
  347.  
  348.  
  349. static void getOption(int argc, char *argv[])
  350. {
  351. #define    error_exit(msg)  { printf("%s\n",(msg)); exit(0); }
  352.     char c;
  353.     int i,n;
  354.     char *p;
  355.     for (i=1; i<argc; i++)
  356.     {
  357.         p = argv[i];
  358.         if (*p == '-')
  359.         {
  360.             p++;
  361.             c = tolower(*p);
  362.             switch (c)
  363.             {
  364.             case '0'..'9':
  365.                 n = atoi(p);
  366.                 switch (n)
  367.                 {
  368.                 case 16:        // 16 色モード
  369.                     // scrmode = 3;
  370.                     white = 15;
  371.                     // editXlen = 640, editYlen = 480;
  372.                     break;
  373.                 case 32:        // 3万色モード
  374.                     mode = MODE32K;
  375.                     white = 32767;
  376.                     _editxlen = 320, _editylen = 240;
  377.                     break;
  378.                 case 3232:        // 3万色モード、高解像度編集
  379.                     mode = MODE32K;
  380.                     white = 32767;
  381.                     _editxlen = 512, _editylen = 480;
  382.                     // menumode = 1;
  383.                     break;
  384.                 case 1616:        // 16色モード、2048×2048ドット編集
  385.                     // scrmode = 3;
  386.                     white = 15;
  387.                     // editXlen = 2048, editYlen = 2048;
  388.                     break;
  389.                 default:
  390.                     error_exit("無効な画面モードです。");
  391.                 }
  392.                 break;
  393.             case 'x':
  394.                 n = atoi(p+1);
  395.                 if (n < 1)
  396.                     error_exit("編集範囲のX方向長の指定が小さすぎます。");
  397.                 _editxlen = n;
  398.                 break;
  399.             case 'y':
  400.                 n = atoi(p+1);
  401.                 if (n < 1)
  402.                     error_exit("編集範囲のY方向長の指定が小さすぎます。");
  403.                 _editylen = n;
  404.                 break;
  405.             case 'd':
  406.                 debug = YES;
  407.                 break;
  408.             case 'r':
  409.                 if (strncmp(p, "rio2", 4) == 0)
  410.                     ryosuke_pat = YES;
  411.                 else if (strncmp(p, "rio", 3) == 0)
  412.                     ryosuke = YES;
  413.                 break;
  414.             case 'm':    // メニューモード
  415.                 // menumode = atoi(p+1);
  416.                 break;
  417.             case 'h':
  418.             case '?':
  419.                 printf("\
  420. ARTemis version 1.2  (C)1993 MATSUUCHI Ryosuke\n\
  421. 起動方法: run386 artemis [オプション]\n\
  422. オプション:\n\
  423.     -x<n>    画像の横方向のドット数\n\
  424.     -y<n>    画像の縦方向のドット数\n\
  425.     -h / -?  このメッセージの表示\n\
  426. ");
  427.                 exit(0);
  428.             }
  429.         }
  430.     }
  431. #undef error_exit
  432. }
  433.  
  434.  
  435. /*--------------------------------------------------------*/
  436. /*              オプション設定に従った初期化              */
  437. /*--------------------------------------------------------*/
  438.  
  439.  
  440. static int setupAsPara()
  441. {
  442.     pltnum = (whiteback ? 0 : PLTNUM-1);
  443.     if (_editxlen >= 512 && _editylen >= 480 && _zoomrate == 2)
  444.         _zoomrate = 1;
  445.     if (EIMnew(0,_editxlen,_editylen) != 0)
  446.         return -1;
  447.     return 0;
  448. }
  449.  
  450.  
  451. /*--------------------------------------------------------*/
  452. /*                         メイン                         */
  453. /*--------------------------------------------------------*/
  454.  
  455.  
  456. int main(int argc, char *argv[])
  457. {
  458.   if (initVar() != 0)
  459.     {
  460.       printf("メモリが不足しています(1)\n");
  461.       exit(0);
  462.     }
  463.   loadConfig();
  464.   getOption(argc, argv);
  465.   checkPara();
  466.   if (setupAsPara() != 0)
  467.     {
  468.       printf("メモリが不足しています(2)\n");
  469.       exit(0);
  470.     }
  471.   DEBUG_MSG("-------- ARTemis start --------");
  472.   if (cbuf_init() != 0 ||
  473.       TIFFinitwork() != 0 || area_init() != 0 || filemenu_init() != 0 ||
  474.       mask_init() != 0 || spray_init() != 0 || mathtbl_init() != 0 ||
  475.       pen_init() != 0)
  476.     {
  477.       printf("メモリが不足しています(3)\n");
  478.       exit(0);
  479.     }
  480.   loadPenData();
  481.   menu_init();
  482.   DEBUG_MSG("menu_init 終了");
  483.   if (initIO() != 0)
  484.     {
  485.       printf("メモリが不足しています(4)\n");
  486.       exit(0);
  487.     }
  488.   DEBUG_MSG("initIO 終了");
  489.   iniScr();
  490.   DEBUG_MSG("iniScr 終了");
  491.   ARTsetintvector();
  492.   DEBUG_MSG(debugmsg);
  493.   
  494.   do_mainmenu();
  495.   
  496.   saveConfig();
  497.   int_end();
  498.   mend();
  499.   DMdelete();
  500.   filemenu_end();
  501.   menu_end();
  502.   pen_end();
  503.   ARTresetintvector();
  504.   mma_freeSeg(font12seg);
  505.   KYB_clic(1);    /* キークリック音オフ */
  506.   return 0;
  507. }
  508.  
  509. /* end of artemis.c */
  510.